home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / diskreader / examples / readturr2disk.asm < prev    next >
Assembly Source File  |  2000-02-28  |  2KB  |  73 lines

  1. ; Turrican 2 disk image reader
  2.  
  3. NO_INCLUDES=1
  4.  
  5.     IFD    ADF
  6.     include    adfreader.asm
  7.     ELSE
  8.     include    diskreader.asm
  9.     ENDC
  10.  
  11.     BUFFER    TRACKBUFFER
  12.  
  13. ; track 0: dos track
  14. ; $60000 loader after bootblock, 2048 bytes
  15.     DOSREAD    #0
  16.     WRITE    #2048,#1024
  17.  
  18. ; track 1: hiscores track (done in readturr2hisc.asm)
  19. ; - $4489 MFM sync
  20. ; - unused byte (encoded as 2 bytes MFM)
  21. ; - longword checksum. XOR of all proceeding raw MFM data, then
  22. ;   odd bits masked out and XOR by $12345678 (encoded as MFM long)
  23. ; - unused longword (encoded as 8 bytes MFM), not included in checksum
  24. ; - 400 bytes hiscore data (encoded as 100 8-byte MFM encoded longwords)
  25.  
  26. ; tracks 2-159:
  27. ; - $9521 MFM sync
  28. ; - unused byte (encoded as 2 bytes MFM)
  29. ; - 6800 bytes of data (stored as 1700 8-byte MFM encoded longwords)
  30. ; - longword checksum, which is XOR of all preceding raw MFM data, then
  31. ;   odd bits masked out (encoded as MFM long)
  32.  
  33.     moveq    #2,d7    ; d7 = tracknumber
  34. .nxttrk    RAWREAD    d7    ; read track
  35.     RESYNC    #$9521    ; resync track
  36.  
  37.     lea    TRACKBUFFER,a0    ; beginning of buffer
  38.     lea    4(a0),a1    ; beginning of data in buffer
  39.  
  40.     move.w    #(6800/4)-1,d0
  41.     moveq    #0,d3        ; accumulated checksum
  42.     move.l    #$55555555,d4    ; 0101010101010...
  43. .decode    movem.l    (a1)+,d1/d2    ; read 8-byte MFM encoded long
  44.     eor.l    d1,d3        ; checksum raw MFM data
  45.     eor.l    d2,d3
  46.     and.l    d4,d1        ; decode MFM long
  47.     and.l    d4,d2
  48.     add.l    d1,d1
  49.     or.l    d2,d1
  50.     move.l    d1,(a0)+    ; write long
  51.     dbra    d0,.decode
  52.  
  53.     movem.l    (a1)+,d1/d2    ; get stored checksum
  54.     and.l    d4,d1        ; decode
  55.     and.l    d4,d2
  56.     add.l    d1,d1
  57.     or.l    d2,d1
  58.     and.l    d4,d3        ; mask odd bits out
  59.     cmp.l    d1,d3        ; verify checksum
  60.     beq.s    .ok
  61.     cmp.b    #159,d7
  62.     beq.s    .ok
  63.     FAILURE    cksum(pc)
  64.  
  65. .ok    WRITE    #6800
  66.  
  67.     addq.w    #1,d7
  68.     cmp.w    #160,d7
  69.     bne.s    .nxttrk
  70.     rts
  71.  
  72. cksum    dc.b    "bad checksum",0
  73.